/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.dao.exceptions.ClaroException;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.entity.Aplicacion;
import co.com.claro.administracionSolicitudes.entity.Gerencia;
import co.com.claro.administracionSolicitudes.entity.Perfil;
import co.com.claro.administracionSolicitudes.entity.PrivilegioSolicitud;
import co.com.claro.administracionSolicitudes.datamodel.PrivilegiosDynamicDataModel;
import co.com.claro.administracionSolicitudes.dto.PrivilegioSolicitudDto;
import co.com.claro.administracionSolicitudes.entity.Usuario;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

/**
 *
 * @author usuario
 */
@ManagedBean
@ViewScoped
public class PrivilegiosBean {

    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;

    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;
    /**
     * Entidad que contiene los privilegios de la base de datos
     */
    private PrivilegiosDynamicDataModel privilegios;
    /**
     * Lista que contiene las aplicaciones almacenadas en la base de datos
     */
    private List<SelectItem> aplicacionesItems;
    /**
     * Lista que contiene las gerencias almacenadas en la base de datos
     */
    private List<SelectItem> gerenciasItems;
    /**
     * Lista que contiene los perfiles almacenados en la base de datos
     */
    private List<SelectItem> perfilesItems;
    /**
     * Variable que almacena la aplicación seleccionada por el usuario
     */
    private String aplicacionSeleccionada;
    /**
     * Variable que almacena la gerencia seleccionada por el usuario
     */
    private String gerenciaAprobadoraSeleccionada;
    /**
     * Variable que almacena el perfil seleccionado por el usuario
     */
    private String perfilSeleccionada;

    private Integer idPrivilegioSeleccionado;

    private final int filas = 30;

    private String columnaSorteada;
    private boolean ascendiente;

    private final static String COL_DEFAULT_SORT = "idAplicacion.nombre";

    private String mensaje;

    private boolean modificado;

    /**
     * Creates a new instance of PrivilegiosBean
     */
    public PrivilegiosBean() {
    }

    @PostConstruct
    public void inicializarValores() {
        modificado = false;

        columnaSorteada = COL_DEFAULT_SORT;
        ascendiente = true;

        llenarFiltros();
        llenarPrivilegios();
    }

    //+++++++++++++++++++++++++++++++ MÉTODOS PROPIOS DEL BEAN ++++++++++++++++++++++++++++++++++
    /**
     * Método que se encarga de llenar los filtros de los select en el cargue
     * inicial de la pagina.
     */
    private void llenarFiltros() {
        List<Aplicacion> aplicaciones = localDatabase.findAplicacionByEstado(EstadoActividadEnum.ACTIVO.getId());
        List<Gerencia> gerencias = localDatabase.findGerenciaByEstado(EstadoActividadEnum.ACTIVO.getId());
        List<Perfil> perfiles = localDatabase.findPerfilByEstado(EstadoActividadEnum.ACTIVO.getId());

        llenarAplicaciones(aplicaciones);
        llenarGerencias(gerencias);
        llenarPerfiles(perfiles);
    }

    /**
     * Método que llena la lista de aplicaciones para mostrarle al usuario
     *
     * @param aplicaciones, las aplicaciones de la base de datos
     */
    private void llenarAplicaciones(List<Aplicacion> aplicaciones) {
        if (aplicacionesItems == null) {
            aplicacionesItems = new ArrayList<SelectItem>();
        }
        for (Aplicacion temporal : aplicaciones) {
            aplicacionesItems.add(new SelectItem(temporal.getIdAplicacion(), temporal.getNombre()));
        }
    }

    /**
     * Método que llena la lista de gerencias para mostrarle al usuario
     *
     * @param gerencias, las gerencia de la base de datos
     */
    private void llenarGerencias(List<Gerencia> gerencias) {
        if (gerenciasItems == null) {
            gerenciasItems = new ArrayList<SelectItem>();
        }
        for (Gerencia temporal : gerencias) {
            gerenciasItems.add(new SelectItem(temporal.getIdGerencia(), temporal.getNombre()));
        }
    }

    /**
     * Método que llena la lista de perfiles para mostrarle al usuario
     *
     * @param perfiles, los perfiles de la base de datos
     */
    private void llenarPerfiles(List<Perfil> perfiles) {
        if (perfilesItems == null) {
            perfilesItems = new ArrayList<SelectItem>();
        }
        for (Perfil temporal : perfiles) {
            perfilesItems.add(new SelectItem(temporal.getIdPerfil(), temporal.getNombre()));
        }
    }

    /**
     * Método que obtiene el id del objeto contenido dentro del data table
     *
     * @param ActionEvent, evento para buscar el objeto dentro del contexto
     * @return Object, con el id del objeto
     */
    private void prepararCamposModificar(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();

        //Obtengo el id del privilegio
        UIComponent componente = event.getComponent().findComponent("idPrivilegioOutputText");
        idPrivilegioSeleccionado = (Integer) componente.getValueExpression("value").getValue(context.getELContext());

        //Obtengo el id de la aplicación
        componente = event.getComponent().findComponent("idAplicacionOutputText");
        Integer id = (Integer) componente.getValueExpression("value").getValue(context.getELContext());

        aplicacionSeleccionada = id.toString();

        //Obtengo el id de la gerencia
        componente = event.getComponent().findComponent("idGerenciaOutputText");
        Short shortId = (Short) componente.getValueExpression("value").getValue(context.getELContext());

        gerenciaAprobadoraSeleccionada = shortId.toString();

        //Obtengo el id del perfil
        componente = event.getComponent().findComponent("idPerfilOutputText");
        id = (Integer) componente.getValueExpression("value").getValue(context.getELContext());

        perfilSeleccionada = id.toString();
    }

    private PrivilegioSolicitud obtenerPrivilegioDeBD(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();

        //Obtengo el id del privilegio
        UIComponent componente = event.getComponent().findComponent("idPrivilegioOutputText");
        Integer id = (Integer) componente.getValueExpression("value").getValue(context.getELContext());

        return localDatabase.findPrivilegioSolicitud(id);
    }

    /**
     * Método que borra los campos cuando se han hecho modificaciones
     */
    public void borrarCampos() {
        perfilSeleccionada = null;
        gerenciaAprobadoraSeleccionada = null;
        aplicacionSeleccionada = null;
        idPrivilegioSeleccionado = null;

        modificado = false;

        llenarPrivilegios();
    }

    /**
     * Método que obtiene los privilegios desde la base de datos
     */
    private void llenarPrivilegios() {
        PrivilegioSolicitudDto dto = new PrivilegioSolicitudDto();
        dto.setActivo(EstadoActividadEnum.ACTIVO.getId());
        dto.setAscendiente(ascendiente);
        dto.setCampoSorteado(columnaSorteada);

        privilegios = new PrivilegiosDynamicDataModel(localDatabase, dto);
    }

    private boolean camposVacios() {
        return aplicacionSeleccionada == null || gerenciaAprobadoraSeleccionada == null || perfilSeleccionada == null;
    }

    //+++++++++++++++++++++++++++++ EVENTOS PROPIOS DEL BEAN +++++++++++++++++++++++++
    /**
     * Método o evento usado para obtener el objeto seleccionado del data table
     * por el usuairo
     *
     * @param event, objeto que contiene los datos del data table.
     */
    public void seleccionarPrivilegios(ActionEvent event) {
        modificado = true;
        prepararCamposModificar(event);
    }

    /**
     * Método o evento encargado de crear el privilegio en la base de datos a
     * partir de los datos seleccionados por el usuario en la pantalla.
     *
     */
    public void crearPrivilegio() {
        if (!camposVacios()) {
            PrivilegioSolicitud privilegio = new PrivilegioSolicitud();

//        privilegio.setAccion(Short.parseShort(accionSeleccionada));
            privilegio.setActivo(EstadoActividadEnum.ACTIVO.getId());
            privilegio.setIdAplicacion(new Aplicacion(Integer.parseInt(aplicacionSeleccionada)));
            privilegio.setIdGerencia(new Gerencia(Short.parseShort(gerenciaAprobadoraSeleccionada)));
            privilegio.setIdPerfil(new Perfil(Integer.parseInt(perfilSeleccionada)));

            Aplicacion a = localDatabase.findAplicacion(Integer.parseInt(aplicacionSeleccionada));

            privilegio.setIdTipoSolicitud(a.getTipoAplicacion().getIdTipoAplicacion());

            try {
                Usuario u = sesionBean.getUsuario();
                privilegio.setUsuario(u.getUsername());

                if (localDatabase.countPrivilegioByAplicacionGerenciaPerfil(privilegio.getIdAplicacion().getIdAplicacion(),
                        privilegio.getIdGerencia().getIdGerencia(),
                        privilegio.getIdPerfil().getIdPerfil(),
                        EstadoActividadEnum.ACTIVO.getId()) == 0) {
                    localDatabase.crearPrivilegioSolicitud(privilegio);
                    mensaje = ResourceBundle.getBundle("mensajes").getString("privilegioCreadoOk");
                } else {
                    mensaje = ResourceBundle.getBundle("errores").getString("errorPrivilegioRepetido");
                }
            } catch (ClaroException ex) {
                mensaje = ex.getMessage();
            }
        } else {
            mensaje = ResourceBundle.getBundle("errores").getString("errorPrivilegioVacio");
        }
        borrarCampos();
        llenarPrivilegios();
    }

    public void eliminarPrivilegio(ActionEvent event) {
        try {
            PrivilegioSolicitud privilegio = obtenerPrivilegioDeBD(event);

            Usuario u = sesionBean.getUsuario();
            privilegio.setUsuario(u.getUsername());
            localDatabase.borradoLogicoPrivilegioSolicitud(privilegio);
        } catch (ClaroException ex) {
            mensaje = ex.getMessage();
        }
        borrarCampos();
        llenarPrivilegios();
    }

    public void modificarPrivilegio(ActionEvent event) {
        try {
            if (!camposVacios()) {
                PrivilegioSolicitud seleccionado = localDatabase.findPrivilegioSolicitud(idPrivilegioSeleccionado);

                Usuario u = sesionBean.getUsuario();
                seleccionado.setUsuario(u.getUsername());
                seleccionado.setActivo(EstadoActividadEnum.ACTIVO.getId());
                seleccionado.setIdAplicacion(new Aplicacion(Integer.parseInt(aplicacionSeleccionada)));
                seleccionado.setIdGerencia(new Gerencia(Short.parseShort(gerenciaAprobadoraSeleccionada)));
                seleccionado.setIdPerfil(new Perfil(Integer.parseInt(perfilSeleccionada)));

                localDatabase.modificarPrivilegioSolicitud(seleccionado);
                mensaje = ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk");
            } else {
                mensaje = ResourceBundle.getBundle("errores").getString("errorPrivilegioVacio");
            }
        } catch (ClaroException ex) {
            mensaje = ex.getMessage();
        }
        borrarCampos();
        llenarPrivilegios();
    }

    public void ordenar() {
        String property = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
                .get("sortProperty");

        if (property != null) {
            if (columnaSorteada.equals(property)) {
                ascendiente = !ascendiente;
            } else {
                columnaSorteada = property;
                ascendiente = true;
            }
        }

        llenarPrivilegios();
    }

    public boolean paginado() {
        return privilegios.getTotalCount() > filas;
    }

    //+++++++++++++++++++++++++++++ GETTERS Y SETTERS ++++++++++++++++++++++++++++++++
    public List<SelectItem> getAplicacionesItems() {
        return aplicacionesItems;
    }

    public void setAplicacionesItems(List<SelectItem> aplicacionesItems) {
        this.aplicacionesItems = aplicacionesItems;
    }

    public List<SelectItem> getGerenciasItems() {
        return gerenciasItems;
    }

    public void setGerenciasItems(List<SelectItem> gerenciasItems) {
        this.gerenciasItems = gerenciasItems;
    }

    public List<SelectItem> getPerfilesItems() {
        return perfilesItems;
    }

    public void setPerfilesItems(List<SelectItem> perfilesItems) {
        this.perfilesItems = perfilesItems;
    }

    public String getAplicacionSeleccionada() {
        return aplicacionSeleccionada;
    }

    public void setAplicacionSeleccionada(String aplicacionSeleccionada) {
        this.aplicacionSeleccionada = aplicacionSeleccionada;
    }

    public String getPerfilSeleccionada() {
        return perfilSeleccionada;
    }

    public void setPerfilSeleccionada(String perfilSeleccionada) {
        this.perfilSeleccionada = perfilSeleccionada;
    }

    public String getGerenciaAprobadoraSeleccionada() {
        return gerenciaAprobadoraSeleccionada;
    }

    public void setGerenciaAprobadoraSeleccionada(String gerenciaAprobadoraSeleccionada) {
        this.gerenciaAprobadoraSeleccionada = gerenciaAprobadoraSeleccionada;
    }

    public PrivilegiosDynamicDataModel getPrivilegios() {
        return privilegios;
    }

    public void setPrivilegios(PrivilegiosDynamicDataModel privilegios) {
        this.privilegios = privilegios;
    }

    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public int getFilas() {
        return filas;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

    public boolean isModificado() {
        return modificado;
    }

    public void setModificado(boolean modificado) {
        this.modificado = modificado;
    }

    public boolean isAscendiente() {
        return ascendiente;
    }

}
